const User = require('../models/user.model');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

// 用户注册
exports.register = async (req, res) => {
  const { username, email, password } = req.body;

  try {
    // 检查用户或邮箱是否已存在
    let user = await User.findOne({ $or: [{ email }, { username }] });
    if (user) {
      return res.status(400).json({ error: '用户名或邮箱已被注册' });
    }

    // 创建新用户实例
    user = new User({
      username,
      email,
      password, 
    });
    await user.save();

    // 生成 JWT
    const payload = {
      user: {
        _id: user._id,
        role: user.role
      }
    };

    jwt.sign(
      payload,
      process.env.JWT_SECRET || 'your-default-super-secret-key-for-dev',
      { expiresIn: '7d' }, // Token 有效期 7 天
      (err, token) => {
        if (err) throw err;
        // 返回 token 和用户信息（不含密码）
        res.status(201).json({ 
          token, 
          user: { 
            _id: user._id, 
            username: user.username, 
            email: user.email, 
            role: user.role,
            avatar: user.avatar // 即使是 null 也返回
          } 
        });
      }
    );

  } catch (error) {
    console.error('注册失败:', error.message);
    res.status(500).json({ error: '服务器错误，注册失败' });
  }
};

// 用户登录
exports.login = async (req, res) => {
  const { account, password } = req.body;
  console.log(`登录尝试 - 账号: ${account}`); 

  try {
    // 查找用户（支持邮箱或用户名登录）
    const user = await User.findOne({
      $or: [
        { email: account },
        { username: account }
      ]
    });

    if (!user) {
      console.log(`登录失败 - 未找到用户: ${account}`); 
      return res.status(400).json({ error: '账号或密码错误' });
    }
    console.log(`登录尝试 - 找到用户: ${user.username} (ID: ${user._id})`); 

    // 比较密码
    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) {
      console.log(`登录失败 - 密码不匹配: ${account}`); 
      return res.status(400).json({ error: '账号或密码错误' });
    }
    console.log(`登录成功 - 密码匹配: ${account}`); 

    // 生成 JWT
    const payload = {
      userId: user._id, // 注意：之前这里是 user: { _id: user._id, role: user.role }，可能导致后续中间件解析问题，统一为 userId
      role: user.role
    };

    jwt.sign(
      payload,
      process.env.JWT_SECRET || 'your-default-super-secret-key-for-dev',
      { expiresIn: '7d' }, // Token 有效期 7 天
      (err, token) => {
        if (err) throw err;
        res.status(201).json({ 
          token, 
          user: { 
            _id: user._id, 
            username: user.username, 
            email: user.email, 
            role: user.role,
            avatar: user.avatar 
          } 
        });
      }
    );

  } catch (error) {
    console.error('登录失败:', error.message);
    res.status(500).json({ error: '服务器错误，登录失败' });
  }
};

// 获取当前登录用户信息 (如果需要的话)
exports.getMe = async (req, res) => {
  try {
    const user = await User.findById(req.user._id).select('-password');
    if (!user) {
      return res.status(404).json({ error: '用户不存在' });
    }
    res.json(user);
  } catch (error) {
    console.error('获取用户信息失败:', error.message);
    res.status(500).json({ error: '服务器错误' });
  }
};

// 用户退出登录
exports.logout = (req, res) => {
  res.status(200).json({ message: '退出登录成功' });
};

// 处理忘记密码请求
exports.forgotPassword = async (req, res) => {
  const { email } = req.body;
  console.log(`收到 ${email} 的密码重置请求，邮件发送功能待实现。`);
  res.status(200).json({ message: '如果邮箱存在，密码重置邮件已发送' });
};

// 重置密码 
exports.resetPassword = async (req, res) => {
  const { token, password } = req.body;
  console.log(`收到密码重置请求，token: ${token}，密码重置功能待实现。`);
  res.status(200).json({ message: '密码重置成功' });
};